package fiuba.algo3.TPFinal;

import java.util.ArrayList;
import java.util.Iterator;


public class Hectarea implements Superficie {
	Edificable construccion;
	protected ArrayList<Servicio> servicios;
	protected boolean construida;
	protected Posicion posicion;
	protected ArrayList<Posicion>posicionesAlrededor;
	protected Zona zona;
	public Hectarea(){
		
		servicios = new ArrayList<Servicio>();
		construida = false;
		this.posicionesAlrededor = new ArrayList<Posicion>();
		this.zona=new Zona();
		};
	public void ubicarEnPosicion(Posicion posicion){
		this.posicion=posicion;
		this.cargarPosicionesAlrededor(posicion.obtenerSiguienteAbajo());
		this.cargarPosicionesAlrededor(posicion.obtenerSiguienteAbajoDerecha());
		this.cargarPosicionesAlrededor(posicion.obtenerSiguienteAbajoIzquierda());
		this.cargarPosicionesAlrededor(posicion.obtenerSiguienteArriba());
		this.cargarPosicionesAlrededor(posicion.obtenerSiguienteArribaDerecha());
		this.cargarPosicionesAlrededor(posicion.obtenerSiguienteArribaIzquierda());
		this.cargarPosicionesAlrededor(posicion.obtenerSiguienteDerecha());
		this.cargarPosicionesAlrededor(posicion.obtenerSiguienteIzquierda());
	};
	
	private void cargarPosicionesAlrededor(Posicion pos) {
		if(pos!=null){
			this.posicionesAlrededor.add(pos);
		}
		
		
	}
	public void edificar(Edificable construccion) throws HectareaConstruidaException {
		if(this.construida){ throw new HectareaConstruidaException();}
		this.construccion = construccion;
		construccion.edificarEnSuperfice(this);
		this.construccionFinalizada();
			
	};
	
	public void construccionFinalizada(){
		construida=true;
	};
	public boolean estaOcupada(){
		return (this.construccion != null);
		
	};
	public void pedirServiciosNecesariosparaConstruir()throws NoCumpleRequisitoParaContruirseException{
			
		ArrayList<Servicio> servicios = this.construccion.obtenerServiciosNecesariosParaConstruir();
		if(!this.poseeTodosLosServicios(servicios)){
			construccion=null;
			throw new NoCumpleRequisitoParaContruirseException();
		}else{
			this.construccion.HabilitarServiciosDeContruccion();
		}
		
		
	};
	
	public boolean poseeTodosLosServicios(ArrayList<Servicio> serviciosDeConstruccion){
		return this.servicios.containsAll(serviciosDeConstruccion) ;
	};

	public void agregarServicio(Servicio servicio){
		this.servicios.add(servicio);
	}
	
	protected ArrayList<String>convertirEnString(ArrayList<Servicio> serviciosDeConstruccion){
		
		ArrayList<String> serviciosAux = new ArrayList<String>();
		Iterator<Servicio> it = serviciosDeConstruccion.iterator();
		Servicio servicio;
		while(it.hasNext()){
			servicio = it.next();
			serviciosAux.add(servicio.obtenerContenido());
		};
		return serviciosAux;
	}
	public void conectar(Conectable conexion) {
		conexion.proveerServicio(this);
		
	}
	
	public void posicionesArribaDerecha(int rango,Posicion pos){
		if(pos.tieneSigArribaDerecha()&&rango>0){
			this.posicionesArribaDerecha(rango-1, pos);
		}
		this.zona.addHectarea(pos.obtenerSuperficie());
	}
	
	public void posicionesArribaIzquierda(int rango,Posicion pos){
		if(pos.tieneSigArribaIzquierda()&&rango>0){
			this.posicionesArribaIzquierda(rango-1, pos);
		}
		this.zona.addHectarea(pos.obtenerSuperficie());
	}
	public void posicionesAbajoIzquierda(int rango,Posicion pos){
		if(pos.tieneSigAbajoIzquierda()&&rango>0){
			this.posicionesAbajoIzquierda(rango-1, pos);
			
		}
		this.zona.addHectarea(pos.obtenerSuperficie());
	}
	
	public void posicionesAbajoDerecha(int rango,Posicion pos){
		if(pos.tieneSigAbajoDerecha()&&rango>0){
			this.posicionesAbajoDerecha(rango-1, pos.obtenerSiguienteAbajoDerecha());
			
		}
		this.zona.addHectarea(pos.obtenerSuperficie());
	}
	
	public void posicionesDiagonal(int rango){
		Posicion pos=this.posicion;
		if(pos.tieneSigAbajoDerecha()){
		this.posicionesAbajoDerecha(rango-1, pos.obtenerSiguienteAbajoDerecha());
		};
		if(pos.tieneSigAbajoIzquierda()){
		this.posicionesAbajoIzquierda(rango-1, pos.obtenerSiguienteAbajoIzquierda());
		};
		
		if(pos.tieneSigArribaDerecha()){
		this.posicionesArribaDerecha(rango-1, pos.obtenerSiguienteArribaDerecha());
		}
		if(pos.tieneSigArribaIzquierda()){
		this.posicionesArribaIzquierda(rango-1, pos.obtenerSiguienteArribaIzquierda());};
	}
	
	public void posicionesDiagonalesArriba(int rango,Posicion pos){
		if(rango>0 && pos!=null){
			if(pos.tieneSigArribaDerecha()){
			this.posicionesArribaDerecha(rango, pos.obtenerSiguienteArribaDerecha());
			}
			if(pos.tieneSigArribaIzquierda()){
			this.posicionesArribaIzquierda(rango, pos.obtenerSiguienteArribaIzquierda());
			}
			}
	}
	public void posicionesDiagonalesAbajo(int rango,Posicion pos){
		if(rango>0 && pos!=null){
			if(pos.tieneSigAbajoDerecha()){
			this.posicionesAbajoDerecha(rango, pos.obtenerSiguienteAbajoDerecha());
			}
			if(pos.tieneSigAbajoIzquierda()){
			this.posicionesAbajoIzquierda(rango, pos.obtenerSiguienteAbajoIzquierda());
			}
			}
	}
	public void posicionesDiagonalesDerecha(int rango,Posicion pos){
		if(rango>0 && pos!=null){
			if(pos.tieneSigAbajoDerecha()){
			this.posicionesAbajoDerecha(rango, pos.obtenerSiguienteAbajoDerecha());
			}
			if(pos.tieneSigArribaDerecha()){
			this.posicionesArribaDerecha(rango, pos.obtenerSiguienteArribaDerecha());
			}
		}
	}
	public void posicionesDiagonalesIzquierda(int rango,Posicion pos){
		if(rango>0 && pos!=null){
			if(pos.tieneSigAbajoIzquierda()){
			this.posicionesAbajoIzquierda(rango, pos.obtenerSiguienteAbajoIzquierda());
			}
		if(pos.tieneSigArribaIzquierda()){	
			this.posicionesArribaIzquierda(rango, pos.obtenerSiguienteArribaIzquierda());
		}
		}
	}

	
	public Zona pedirZona(int rango){
		if(posicion==null){ throw new PosicionHectareaInvalidaException();};
		
		this.zona=new Zona();
		
		this.zona.addHectareaCentro(this.posicion.obtenerSuperficie());
		
		this.posicionesDiagonal(rango);
		Posicion posAux;
		
		posAux=posicion.obtenerSiguienteDerecha();
		int i=rango;
		while( posAux!=null&&i>0 ){
			i--;
			this.posicionesDiagonalesDerecha(i, posAux);
			this.zona.addHectarea(posAux.obtenerSuperficie());
			
			posAux=posAux.obtenerSiguienteDerecha();			
			
		}
		i=rango;
		posAux=posicion.obtenerSiguienteIzquierda();
		while( posAux!=null&&i>0 ){
			i--;
			this.posicionesDiagonalesIzquierda(i, posAux);
			this.zona.addHectarea(posAux.obtenerSuperficie());
			
			posAux=posAux.obtenerSiguienteIzquierda();			
		
		
		}
		i=rango;
		posAux=posicion.obtenerSiguienteArriba();
		while( posAux!=null&&i>0 ){
			i--;
			this.posicionesDiagonalesArriba(i, posAux);
			this.zona.addHectarea(posAux.obtenerSuperficie());
			
			posAux=posAux.obtenerSiguienteArriba();			
			
		}
		i=rango;
		posAux=posicion.obtenerSiguienteAbajo();
		while( posAux!=null&&i>0 ){
			i--;
			this.posicionesDiagonalesAbajo(i, posAux);
			this.zona.addHectarea(posAux.obtenerSuperficie());
			posAux=posAux.obtenerSiguienteAbajo();			
			
		}
		
		
		return this.zona;	
	}
	public void comenzarDanio(int Radio) {
		
		
	}
//	
//	public void danioRecursivo(Posicion posicion,int radioDeDanio ){
//		if(posicion!=null&&){
//			this.danioRecursivo(p, radioDeDanio-1);
//		}
//		if(this.construccion){
//			construccion
//		}
	public Posicion obtenerPosicion() {
		// TODO Auto-generated method stub
		return this.posicion;
	}
		
//	public Zona pedirZona(int rango) {
//		Posicion pos=this.posicion;
//		Posicion posDerecha,posInquierda,posArriba,posAbajo;
//		if(posicion.tieneSiguienteDerecha()){posicion.obtenerContidadADerecha(rango);}
//		posicion.obtenerContidadADerecha(rango);
//		posicion.obtenerCantidadAIzquierda(rango);
//		Posicion.obten erCantidadArriba(rango);
//		Zona zona=new Zona();
//		int i=rango;
//		int j=rango;
//		while((pos!=null)&&(i>0)){
//			zona.addHectarea(pos.obtenerSuperficie());
//			posArriba=pos.obtenerSiguienteArriba()
//			i--;
//		}
//		
//	}		
		
	

}
